package protobuf.codec;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToByteEncoder;
import protobuf.ProtoInstance;
import protobuf.protoClass.ProtoMsg;

/**
 * <pre>
 * +-------+---------+--------+-------------+
 * | magic | version | length |   content   |
 * +-------+---------+--------+-------------+
 * <----------head------------><---content-->
 *     2        2        4
 *
 * （1）写入魔数 magic、版本号 version。
 * （2）写入待发送的 Protobuf POJO实例的二进制字节长度 length。
 *        不包含协议头的长度
 * （3）写入Protobuf POJO实例的二进制字节码内容 content。
 * </pre>
 */

public class MyProtobufEncoder extends MessageToByteEncoder<ProtoMsg.Message> {

    @Override
    protected void encode(ChannelHandlerContext channelHandlerContext, ProtoMsg.Message message, ByteBuf byteBuf_out) throws Exception {

        byteBuf_out.writeShort(ProtoInstance.MAGIC_CODE);    // magic
        byteBuf_out.writeShort(ProtoInstance.VERSION_CODE);  // version

        byte[] bytes = message.toByteArray();   // 转换
        byteBuf_out.writeInt(bytes.length);   // length
        byteBuf_out.writeBytes(bytes);   // content

    }
}
